Description de variables qualitatives¶
. Les notions et procédures apparaissant pour la première fois dans le cours sont suivies d'un astérisque
- Variables qualitatives *
- Boucle for, parcourrir une collection d'objet
- Diagramme à barres *
révisions
- Va falloir nettoyer un peu et sans doute créer un nouveau carnet pour la carto
Données historiques accessibles¶
Trouver des données historiuques pour s'exercer c'est pas si simple que ça. Il y a bien des défauts, par exemple Progedo, mais il faut suivre une procédure complexe et justifier d'un projet de recherches pour avoir droit d'y toucher.
Crininocorpus site par ailleurs remarquable fait exception en fournissant un accès à quelques (trois) tableaux de données très bien présentés.
Il vaut mieux souvent se tourner vers le monde de langue anglaise pour récupérer des datas d'entrâinement de bonne qualité en passant par exemple par data.world.
La plupart du temps cependant ce sont des données plus à même de nourrir la curiosité du sociologue ou de l'éconmiste que de l'hitorien.
Description de variables qualitatives¶
Celles-ci sont de plusieurs types. En sciences sociales et particulièrement en histoire nous avons souvent affaire à des variables dites qualitatives qui s'exprime par l'appartenance à une modalité.
Il est plusieurs façons de le dire ou de le comprendre en utilisant le langage commun. Chaque variable correspond à la répartion des individus entre plusieurs ensembles (les personnées, mariées, en couple mais non mariés, célibataire), la modalité exprime l'apartenance à l'un de ces ensembles. Nous pouvons considérer aussi qu'elle exprime non une mesure ou un comptage, mais la décision d'un observateur/classeur décidant en fonctions de conventions toujours socialement et historiquement situées de l'appartenance de l'individu à tel ou tel groupe. Même des événèments qui nous semblent pouvoir être définis par des critères tout à fait objectifs dépendent pour leur enregistrement des décisions d'un acteur social historiquement situé. L'exemple classique est celui du suicide, dont Durkheim notait déjà que les conditions d'enregistrement pouvait varier d'une culture à l'autre. D'où d'ailleurs l'improtance de l'étude des conventions et des conditions du classement dès que nous avons affaire à ce genre de variables.
Il est possible de réaliser un certain nombre de traitements statistiques sur des données comportant des variables qualitatives, le choix est cependant bien moins important que lorsque nous manipulons des données quantitatives, d'où la nécessité souvent de transformer avant traitement les variables qualitatives en variables quantiatives, généraement discrètes.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import geopandas as gpd
Préparer les données¶
Une étape souvent indispensable lorsque l'on récupère des données d'une enquête depuis une base de donénes quelle que soit sa nature. Très généralement sa structure est déterminée par les exigences du receuil de l'information et non par celles du traitement statistique, ce qui conduit souvnet à la multiplication des variables, de plus très rarement normalisées. Python est dans cette phase égalmente un outil utile, permettant d'obtenir simplement et rapidement des rapports permettant de vérifier le typage des variables, la densité des variables manquantes toutes infomations nécessaires à la préparation du fichier que l'on utilisera pour l'analyse. Nous prenons ici exemple d'une base de données d'Arnaud Sauer décrivant les étrangers inscrits dans diverses localités luxembourgeoises durant l'entre-deux-guerres.
De quel type sont mes variables ?¶
chemin_fichier = 'Doc6/dat.xlsx'
df = pd.read_excel(chemin_fichier)
# Affichage des premières lignes du DataFrame pour vérification
print(df.head())
ID ANNÉE MENTION \
0 8 1919 MANQUANT FICHES 1-97
1 96 1919 Abschrift=Transcription
2 118 1919 Abschrift=Transcription
3 246 1919 Abschrift=Transcription
4 97 1919 NR
(N°_RENVOI_DECLARATIONS_G-D) \
0 NaN
1 NIEDERANVEN_1916_?\nDUDELANGE_1909_(LUXEMBOURG...
2 NÉANT
3 DUDELANGE_1919_157
4 ESCH-SUR-ALZETTE_1918_?\nDIFFERDANGE_1917_524
(DECLARATIONS_LIEES) (LIEUX_TRANSIT_SUCCESSIFS) (SEXE) \
0 NaN NaN NaN
1 NÉANT L, L F
2 NÉANT A-L, A-L M
3 RAPPEL_DUDELANGE_1919_157 A-L, L M
4 RAPPEL_DIFFERDANGE_1917_624 L, L M
(ANNOTATIONS) (REMARQUES) NOM ... \
0 NaN NaN FICHE MANQUANTE ...
1 NR Née à SENNINGEN (NIEDERANVEN) SCHMIT ...
2 NR NR ANDRES ...
3 NR Né à DUDELANGE (Luxembourg) MEIER ...
4 C 54 ans FYOT ...
PRECISION_VACCINATION CERTIFIE_A CERTIFIE_LE PHOTO \
0 !!!! !!!! !!!! !!!!
1 Kommt aus dem Inlande DÜDELINGEN 1919.06.03 Non
2 NR DÜDELINGEN 1919.07.19 Oui
3 NR DÜDELINGEN 1919.12.05 Non
4 NR (DIFFERDANGE) 1919.03.12 ? (déchiré)
SIGNATURE-MARQUE RENSEIGNEMENTS_COMPLÉMENTAIRES STATISTIQUES \
0 !!!! NaN NaN
1 Eugénie Schmit NaN NaN
2 Johann Andres NaN NaN
3 JJMeier NaN NaN
4 ? (déchiré) NaN NaN
SITE_LUXROOTS \
0 NaN
1 MÜNCH Karl Maschinist, Kranenmaschinist\nN : 1...
2 NÉANT
3 MEIER Heinrich Kaufmann, Bäcker, Bäckermeister...
4 NÉANT
SITE_GENEANET \
0 NaN
1 Arbre généalogique de GENEAPAL.COM et David KL...
2 ANDRES Johann\nN : 03/05/1881 à BIETLENHEIM (B...
3 Arbre généalogique de Désirée SÜNNEN :\nMEIER ...
4 FYOT Philibert\nM : 02/12/1896 à TRITH-SAINT-L...
RECONSTITUTIONS_DUDELANGE
0 NaN
1 MUENCH Charles Machiniste\nN : 14.08 1876 à ST...
2 NÉANT
3 10492\nMEIER Henri Boulanger\nN : vers 1863 à ...
4 NÉANT
[5 rows x 299 columns]
print(df.dtypes)
# attention à la syntaxe par défaut la fonction n'affiche qu'une dizaine de variable
# Les fichiers sont souvent bien plus volumineux
# Si nous ne voulons pas modifier les paramètres de notre environnement (cela s'appliquerait ensuite à toute analyse
# Il va nous falloir utiliser une boucle dont nous donnons ici juste le code
## Pour chaque colonne, imprimer le nom et le type de donnée
#for col in df.columns:
# print(f"{col}: {df[col].dtype}")
# Cela permet d'appliquer une même fonction, d'effectuer une même opération pour tous les éléments d'un ensemble.
ID int64
ANNÉE int64
MENTION object
(N°_RENVOI_DECLARATIONS_G-D) object
(DECLARATIONS_LIEES) object
...
RENSEIGNEMENTS_COMPLÉMENTAIRES object
STATISTIQUES object
SITE_LUXROOTS object
SITE_GENEANET object
RECONSTITUTIONS_DUDELANGE object
Length: 299, dtype: object
## Où sont les valeurs manquantes ?
# Pour chaque colonne, imprimer le nom et le nombre de valeurs manquantes
for col in df.columns:
print(f"{col}: {df[col].isnull().sum()}")
ID: 0 ANNÉE: 0 MENTION: 0 (N°_RENVOI_DECLARATIONS_G-D): 2 (DECLARATIONS_LIEES): 2 (LIEUX_TRANSIT_SUCCESSIFS): 2 (SEXE): 2 (ANNOTATIONS): 3 (REMARQUES): 2 NOM: 0 (NOM_DIFFÉRENT): 101 PRENOMS: 0 COMMUNE_RESIDENCE: 0 RUE_RESIDENCE: 0 DATE_ENTREE_RESIDENCE: 0 COMMUNE_NAISSANCE_SOURCE: 0 COMMUNE_ACTUELLE_NAISSANCE: 2 REGION_I_ACTUELLE_NAISSANCE: 9 REGION_II_ACTUELLE_NAISSANCE: 3 PAYS_ACTUEL_NAISSANCE: 2 ANNEE_NAISSANCE: 2 LIEU_NAISSANCE_PERE: 0 LIEU_ACTUEL_NAISSANCE_PERE: 2 REGION_NAISSANCE_PERE_I: 7 REGION_NAISSANCE_PERE_II: 2 PAYS_NAISSANCE_PERE: 2 ANNEE_NAISSANCE_PERE: 112 LIEU_NAISSANCE_MERE: 0 LIEU_ACTUEL_NAISSANCE_MERE: 2 REGION_NAISSANCE_MERE_I: 6 REGION_NAISSANCE_MERE_II: 2 PAYS_NAISSANCE_MERE: 2 ANNEE_NAISSANCE_MERE: 112 NATIONALITE_SOURCE: 0 NATIONALITE_NORMALISÉE: 0 PROFESSION: 0 EMPLOYEUR: 0 LIEU_TRAVAIL: 0 SITUATION_SOURCE: 0 SITUATION_NORMALISEE: 0 LIEU_MARIAGE: 63 PRECISIONS_LIEU_MARIAGE: 63 LIEU_ACTUEL_MARIAGE: 65 REGION_MARIAGE_I: 70 REGION_MARIAGE_II: 65 PAYS_MARIAGE: 65 DATE_MARIAGE: 63 DATE_MARIAGE_APPROXIMATIVE: 63 ANNEE_MARIAGE: 65 NOM_CONJOINT: 63 PRENOMS_CONJOINT: 63 PRECISIONS_CONJOINT: 102 PARENTS_CONJOINT_SOURCE: 105 LIEU_NAISSANCE_CONJOINT: 63 LIEU_ACTUEL_NAISSANCE_CONJOINT: 65 REGION_ACTUELLE_NAISSANCE_CONJOINT_I: 68 REGION_ACTUELLE_NAISSANCE_CONJOINT_II: 65 PAYS_ACTUEL_NAISSANCE_CONJOINT: 65 ANNEE_NAISSANCE_CONJOINT: 65 LIEU_DECES_CONJOINT: 111 DATE_DECES_CONJOINT: 111 NOMBRE_ENFANTS: 67 LIEU_NAISSANCE_ENFANT_I: 97 COMMUNE_NAISSANCE_ACTUELLE_ENFANT_I: 98 REGION_NAISSANCE_ACTUELLE_ENFANT_I_I: 98 REGION_NAISSANCE_ACTUELLE_I_ENFANT_II: 98 PAYS_NAISSANCE_ACTUEL_ENFANT_I: 98 ANNEE_NAISSANCE_ENFANT_I: 97 LIEU_NAISSANCE_ENFANT_II: 103 COMMUNE_NAISSANCE_ACTUELLE_ENFANT_II: 103 REGION_NAISSANCE_ACTUELLE_ENFANT_II_I: 103 REGION_NAISSANCE_ACTUELLE_ENFANT_II_II: 103 PAYS_NAISSANCE_ACTUEL_ENFANT_II: 103 DATE_NAISSANCE_ENFANT_II: 103 DATE_ESTIMEE_ENFANT_II: 103 JOUR_NAISSANCE_ENFANT_II: 103 MOIS_NAISSANCE_ENFANT_II: 103 ANNEE_NAISSANCE_ENFANT_II: 103 NOM_ENFANT_III: 106 PRENOMS_ENFANT_III: 106 LIEU_NAISSANCE_ENFANT_III: 106 COMMUNE_NAISSANCE_ACTUELLE_ENFANT_III: 106 REGION_NAISSANCE_ENFANT_III_I: 107 REGION_NAISSANCE_ENFANT_III_II: 106 PAYS_NAISSANCE_ACTUEL_ENFANT_III: 106 ANNEE_NAISSANCE_ENFANT_III: 106 NOM_ENFANT_IV: 108 PRENOMS_ENFANT_IV: 108 LIEU_NAISSANCE_ENFANT_IV: 108 COMMUNE_NAISSANCE_ACTUELLE_ENFANT_IV: 108 REGION_NAISSANCE_ACTUELLE_ENFANT_IV_I: 108 REGION_NAISSANCE_ACTUELLE_ENFANT_IV_II: 108 PAYS_NAISSANCE_ACTUEL_ENFANT_IV: 108 DATE_NAISSANCE_ENFANT_IV: 108 ANNEE_NAISSANCE_ENFANT_IV: 108 NOM_ENFANT_V: 111 PRENOMS_ENFANT_V: 111 LIEU_NAISSANCE_ENFANT_V: 111 COMMUNE_NAISSANCE_ACTUELLE_ENFANT_V: 111 REGION_NAISSANCE_ACTUELLE_ENFANT_V_I: 111 REGION_NAISSANCE_ACTUELLE_ENFANT_V_II: 111 PAYS_NAISSANCE_ACTUEL_ENFANT_V: 111 ANNEE_NAISSANCE_ENFANT_V: 111 NOM_ENFANT_VI: 111 PRENOMS_ENFANT_VI: 111 LIEU_NAISSANCE_ENFANT_VI: 111 COMMUNE_NAISSANCE_ACTUELLE_ENFANT_VI: 111 REGION_NAISSANCE_ACTUELLE_ENFANT_VI_I: 111 REGION_NAISSANCE_ACTUELLE_ENFANT_VI_II: 111 PAYS_NAISSANCE_ACTUEL_ENFANT_VI: 111 DATE_NAISSANCE_ENFANT_VI: 111 DATE_ESTIMEE_ENFANT_VI: 111 JOUR_NAISSANCE_ENFANT_VI: 111 MOIS_NAISSANCE_ENFANT_VI: 111 ANNEE_NAISSANCE_ENFANT_VI: 111 NOM_ENFANT VII: 112 PRENOMS_ENFANT_VII: 112 LIEU_NAISSANCE_ENFANT_VII: 112 COMMUNE_NAISSANCE_ACTUELLE_ENFANT_VII: 112 REGION_NAISSANCE_ACTUELLE_ENFANT_VII_I: 112 REGION_NAISSANCE_ACTUELLE_ENFANT_VII_II: 112 PAYS_NAISSANCE_ACTUEL_ENFANT_VII: 112 DATE_NAISSANCE_ENFANT_VII: 112 DATE_ESTIMEE_ENFANT_VII: 112 JOUR_NAISSANCE_ENFANT_VII: 112 MOIS_NAISSANCE_ENFANT_VII: 112 ANNEE_NAISSANCE_ENFANT_VII: 112 NOM_ENFANT VIII: 112 PRENOMS_ENFANT_VIII: 112 LIEU_NAISSANCE_ENFANT_VIII: 112 COMMUNE_NAISSANCE_ACTUELLE_ENFANT_VIII: 112 REGION_NAISSANCE_ACTUELLE_ENFANT_VIII_I: 112 REGION_NAISSANCE_ACTUELLE_ENFANT_VIII_II: 112 PAYS_NAISSANCE_ACTUEL_ENFANT_VIII: 112 DATE_NAISSANCE_ENFANT_VIII: 112 DATE_ESTIMEE_ENFANT_VIII: 112 JOUR_NAISSANCE_ENFANT_VIII: 112 MOIS_NAISSANCE_ENFANT_VIII: 112 ANNEE_NAISSANCE_ENFANT_VIII: 112 AVEC_OU_SANS_FAMILLE: 0 MOYEN_EXISTENCE: 0 NOMBRE_RESIDENCES_PRECEDENTES: 0 NOMBRE_RESIDENCE_PRECEDENTES_GRAND-DUCHE: 0 RESIDENCE_LORS_NAISSANCE: 0 LIEU_RESIDENCE_PRECEDENTE_SOURCE_I: 3 Unnamed: 145: 5 COMMUNE_RÉSIDENCE_ACTUELLE_I: 3 REGION_I_RESIDENCE_ACTUELLE_I: 11 REGION_II_RESIDENCE_ACTUELLE_I: 6 PAYS_RESIDENCE_ACTUELLE_I: 3 Unnamed: 150: 112 PERIODE_RESIDENCE_PRECEDENTE_I: 3 DATE_ESTIMEE: 3 JOUR: 3 MOIS: 3 ANNEE: 3 LIEU_RESIDENCE_PRECEDENTE_SOURCE_II: 43 Unnamed: 157: 44 COMMUNE_RESIDENCE_ACTUELLE_II: 43 REGION_I_RESIDENCE_ACTUELLE_II: 46 REGION_II_RESIDENCE_ACTUELLE_II: 43 PAYS_RESIDENCE_ACTUELLE_II: 43 Unnamed: 162: 112 PERIODE_RESIDENCE_PRECEDENTE_II: 43 DATE_ESTIMEE.1: 43 JOUR.1: 43 MOIS.1: 43 ANNEE.1: 43 LIEU_RESIDENCE_PRECEDENTE_SOURCE_III: 82 Unnamed: 169: 84 COMMUNE_RESIDENCE_ACTUELLE_III: 82 REGION_I_RESIDENCE_ACTUELLE_III: 84 REGION_II_RESIDENCE_ACTUELLE_III: 82 PAYS_RESIDENCE_ACTUELLE_III: 82 Unnamed: 174: 112 PERIODE_RESIDENCE_PRECEDENTE_III: 82 DATE_ESTIMEE.2: 82 JOUR.2: 82 MOIS.2: 82 ANNEE.2: 82 LIEU_RESIDENCE_PRECEDENTE_SOURCE_IV: 103 Unnamed: 181: 103 COMMUNE_RESIDENCE_ACTUELLE_IV: 103 REGION_I_RESIDENCE_ACTUELLE_IV: 104 REGION_II_RESIDENCE_ACTUELLE_IV: 103 PAYS_RESIDENCE_ACTUELLE_IV: 103 Unnamed: 186: 112 PERIODE_RESIDENCE_PRECEDENTE_IV: 103 DATE_ESTIMEE.3: 103 JOUR.3: 103 MOIS.3: 103 ANNEE.3: 103 LIEU_RESIDENCE_PRECEDENTE_V: 105 Unnamed: 193: 105 COMMUNE_RESIDENCE_ACTUELLE_V: 105 REGION_I_RESIDENCE_ACTUELLE_V: 105 REGION_II_RESIDENCE_ACTUELLE_V: 105 PAYS_RESIDENCE_ACTUELLE_V: 105 ADRESSE_RESIDENCE_PRECEDENTE_V: 112 PERIODE_RESIDENCE_PRECEDENTE_V: 105 DATE_ESTIMEE.4: 105 JOUR.4: 105 MOIS.4: 105 ANNEE.4: 105 LIEU_RESIDENCE_PRECEDENTE_VI: 111 Unnamed: 205: 111 COMMUNE_RESIDENCE_ACTUELLE_VI: 111 REGION_I_RESIDENCE_ACTUELLE_VI: 111 REGION_II_RESIDENCE_ACTUELLE_VI: 111 PAYS_RESIDENCE_PRECEDENTE_VI: 111 ADRESSE_RESIDENCE_PRECEDENTE_VI: 112 PERIODE_RESIDENCE_PRECEDENTE_VI: 111 DATE_ESTIMEE.5: 111 JOUR.5: 111 MOIS.5: 111 ANNEE.5: 111 LIEU_RESIDENCE_PRECEDENTE_VII: 112 Unnamed: 217: 112 COMMUNE_RESIDENCE_ACTUELLE_VII: 112 REGION_I_RESIDENCE_ACTUELLE_VII: 112 REGION_II_RESIDENCE_ACTUELLE_VII: 112 PAYS_RESIDENCE_PRECEDENTE_VII: 112 ADRESSE_RESIDENCE_PRECEDENTE_VII: 112 PERIODE_RESIDENCE_PRECEDENTE_VII: 112 DATE_ESTIMEE.6: 112 JOUR.6: 112 MOIS.6: 112 ANNEE.6: 112 LIEU_RESIDENCE_PRECEDENTE_VIII: 112 Unnamed: 229: 112 COMMUNE_RESIDENCE_ACTUELLE_VIII: 112 REGION_I_RESIDENCE_ACTUELLE_VIII: 112 REGION_II_RESIDENCE_ACTUELLE_VIII: 112 PAYS_RESIDENCE_ACTUELLE_VIII: 112 ADRESSE_RESIDENCE_PRECEDENTE_VIII: 112 PERIODE_RESIDENCE_PRECEDENTE_VIII: 112 DATE_ESTIMEE.7: 112 JOUR.7: 112 MOIS.7: 112 ANNEE.7: 112 LIEU_RESIDENCE_PRECEDENTE_IX: 112 Unnamed: 241: 112 COMMUNE_RESIDENCE_ACTUELLE_IX: 112 REGION_I_RESIDENCE_ACTUELLE_IX: 112 REGION_II_RESIDENCE_ACTUELLE_IX: 112 PAYS_RESIDENCE_PRECEDENTE_IX: 112 ADRESSE_RESIDENCE_PRECEDENTE_IX: 112 PERIODE_RESIDENCE_PRECEDENTE_IX: 112 DATE_ESTIMEE.8: 112 JOUR.8: 112 MOIS.8: 112 ANNEE.8: 112 LIEU_RESIDENCE_PRECEDENTE X: 112 Unnamed: 253: 112 COMMUNE_RESIDENCE_ACTUELLE_X: 112 REGION_I_RESIDENCE_ACTUELLE_X: 112 REGION_II_RESIDENCE_ACTUELLE_X: 112 PAYS_RESIDENCE_PRECEDENTE_X: 112 ADRESSE_RESIDENCE_PRECEDENTE_X: 112 PERIODE_RESIDENCE_PRECEDENTE_X: 112 DATE_ESTIMEE.9: 112 JOUR.9: 112 MOIS.9: 112 ANNEE.9: 112 LIEU_RESIDENCE_PRECEDENTE XI: 112 Unnamed: 265: 112 COMMUNE_RESIDENCE_ACTUELLE_XI: 112 REGION_I_RESIDENCE_ACTUELLE_XI: 112 REGION_II_RESIDENCE_ACTUELLE_XI: 112 PAYS_RESIDENCE_PRECEDENTE_XI: 112 ADRESSE_RESIDENCE_PRECEDENTE_XI: 112 PERIODE_RESIDENCE_PRECEDENTE_XI: 112 DATE_ESTIMEE.10: 112 JOUR.10: 112 MOIS.10: 112 ANNEE.10: 112 LIEU_PASSEPORT: 0 DATE_PASSEPORT: 0 INFORMATIONS_COMPLEMENTAIRES_PASSEPORT: 0 LIEU_VISA: 0 DATE_VISA: 0 INFOMATIONS_COMPLEMENTAIRES_VISA: 3 PAPIERS_LEGITIMATION: 0 LIEU_VACCINATION: 0 COMMUNE_VACCINATION: 2 RÉGION_VACCINATION_II: 3 RÉGION_VACCINATION_II.1: 3 PAYS_VACCINATION: 2 DATE_VACCINATION: 0 PRECISION_VACCINATION: 0 CERTIFIE_A: 0 CERTIFIE_LE: 0 PHOTO: 0 SIGNATURE-MARQUE: 0 RENSEIGNEMENTS_COMPLÉMENTAIRES: 99 STATISTIQUES: 109 SITE_LUXROOTS: 10 SITE_GENEANET: 6 RECONSTITUTIONS_DUDELANGE: 2
Cela signale que la structure tabulaire n'est pas très adaptée ici, un fichier Json aurait été plus maniable, mais aussi qu'un important travail de parsing et de recodage serait nécessaire afin d'obtenir des données utilisables facilement pour l'analyse.
Description de variables qualitatives¶
chemin_fichier = 'Doc6/data2.xlsx'
df2 = pd.read_excel(chemin_fichier)
# Affichage des premières lignes du DataFrame pour vérification
print(df.head())
ID ANNÉE MENTION \
0 8 1919 MANQUANT FICHES 1-97
1 96 1919 Abschrift=Transcription
2 118 1919 Abschrift=Transcription
3 246 1919 Abschrift=Transcription
4 97 1919 NR
(N°_RENVOI_DECLARATIONS_G-D) \
0 NaN
1 NIEDERANVEN_1916_?\nDUDELANGE_1909_(LUXEMBOURG...
2 NÉANT
3 DUDELANGE_1919_157
4 ESCH-SUR-ALZETTE_1918_?\nDIFFERDANGE_1917_524
(DECLARATIONS_LIEES) (LIEUX_TRANSIT_SUCCESSIFS) (SEXE) \
0 NaN NaN NaN
1 NÉANT L, L F
2 NÉANT A-L, A-L M
3 RAPPEL_DUDELANGE_1919_157 A-L, L M
4 RAPPEL_DIFFERDANGE_1917_624 L, L M
(ANNOTATIONS) (REMARQUES) NOM ... \
0 NaN NaN FICHE MANQUANTE ...
1 NR Née à SENNINGEN (NIEDERANVEN) SCHMIT ...
2 NR NR ANDRES ...
3 NR Né à DUDELANGE (Luxembourg) MEIER ...
4 C 54 ans FYOT ...
PRECISION_VACCINATION CERTIFIE_A CERTIFIE_LE PHOTO \
0 !!!! !!!! !!!! !!!!
1 Kommt aus dem Inlande DÜDELINGEN 1919.06.03 Non
2 NR DÜDELINGEN 1919.07.19 Oui
3 NR DÜDELINGEN 1919.12.05 Non
4 NR (DIFFERDANGE) 1919.03.12 ? (déchiré)
SIGNATURE-MARQUE RENSEIGNEMENTS_COMPLÉMENTAIRES STATISTIQUES \
0 !!!! NaN NaN
1 Eugénie Schmit NaN NaN
2 Johann Andres NaN NaN
3 JJMeier NaN NaN
4 ? (déchiré) NaN NaN
SITE_LUXROOTS \
0 NaN
1 MÜNCH Karl Maschinist, Kranenmaschinist\nN : 1...
2 NÉANT
3 MEIER Heinrich Kaufmann, Bäcker, Bäckermeister...
4 NÉANT
SITE_GENEANET \
0 NaN
1 Arbre généalogique de GENEAPAL.COM et David KL...
2 ANDRES Johann\nN : 03/05/1881 à BIETLENHEIM (B...
3 Arbre généalogique de Désirée SÜNNEN :\nMEIER ...
4 FYOT Philibert\nM : 02/12/1896 à TRITH-SAINT-L...
RECONSTITUTIONS_DUDELANGE
0 NaN
1 MUENCH Charles Machiniste\nN : 14.08 1876 à ST...
2 NÉANT
3 10492\nMEIER Henri Boulanger\nN : vers 1863 à ...
4 NÉANT
[5 rows x 299 columns]
# Pour chaque colonne, imprimer le nom et le type de donnée
for col in df2.columns:
print(f"{col}: {df2[col].dtype}")
id: int64 nom: object prenoms: object age: float64 taille: float64 profession: object naissance_lieu: object naissance_departement: object NumDpt: float64 domicile_commune: object domicile_adresse_dans_paris: object domicile_quartier_de_paris: object marques: object etat_physique: object autorite: object date_entree: datetime64[ns] motif: object duree_detention_prevue: object duree_detention_effective: float64 date_sortie: datetime64[ns] transfert: object observations: object rang: int64
chemin_fichier = 'Doc6/data2.xlsx'
df2 = pd.read_excel(chemin_fichier)
# Affichage des premières lignes du DataFrame pour vérification
print(df2.head())
id nom prenoms age taille profession \
0 360 Barbeth Philibert 46.0 171.0 Cordier
1 268 Legrain Pierre Alexis 18.0 170.0 Vannier
2 683 Ancieux Benjamin 18.0 168.0 Boucher
3 751 Clouet Paul Frédéric 17.0 155.0 Domestique
4 933 Mettivier François Philippe 28.0 183.0 Maçon
naissance_lieu naissance_departement NumDpt domicile_commune ... \
0 Feillens Ain 1.0 Paris ...
1 Borlieux [?] Aisne 2.0 Paris ...
2 Capelle (La) Aisne 2.0 Paris ...
3 Ferté-Milon (La) Aisne 2.0 Paris ...
4 Epieds Aisne 2.0 Comegis ...
etat_physique \
0 Une petite cicatrice sur le pouce de la main g...
1 Une forte cicatrice sur le dessus de la main d...
2 Une forte cicatrice à la tempe gauche, une for...
3 Une cicatrice sur le côté de la pommette du po...
4 NaN
autorite date_entree \
0 Préfet de Police 1815-07-29
1 Directeur général de la Police 1814-11-21
2 Préfet de Police 1816-09-17
3 Préfet de Police 1817-02-12
4 Préfet de Police 1822-11-08
motif duree_detention_prevue \
0 Détenu pendant 15 jours pour avoir tenu des je... 15 jours
1 Jusqu'à nouvel ordre comme mauvais sujet voleur. NaN
2 Pendant quinze jours comme tenant jeu prohibé. 15 jours
3 Jusqu'à nouvel ordre comme pédéraste. NaN
4 Jusqu'à nouvel ordre comme réclusionnaire libé... NaN
duree_detention_effective date_sortie transfert \
0 13.0 1815-08-11 Liberté
1 5.0 1814-11-26 Direction de la Police
2 14.0 1816-10-01 Liberté
3 20.0 1817-03-04 Préfecture de police
4 16.0 1822-11-24 Préfecture de police
observations rang
0 Réintégré le 19/6/1816, pour 15 jours, comme t... 360
1 NaN 268
2 NaN 683
3 NaN 751
4 NaN 933
[5 rows x 23 columns]
# J'obtiens une première description des données quallitaitives du data frame
description_qualitative = df2.describe(include=[object])
# Affichage de la description
print(description_qualitative)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) Cell In[1], line 2 1 # J'obtiens une première description des données quallitaitives du data frame ----> 2 description_qualitative = df2.describe(include=[object]) 4 # Affichage de la description 5 print(description_qualitative) NameError: name 'df2' is not defined
Je peux obtenir une représentation graphqique de la distribution de chaque variable, même si dans ce cas du fait du grand nombre dde modalités cela sera peu lisible pour certaines.
# Configuration de Seaborn. Apparence générale de la figure
sns.set(style="whitegrid")
# Création d'une figure et ajustement de sa taille
plt.figure(figsize=(10, 6))
# Pour chaque colonne qualitative dans le DataFrame
for column in df2.select_dtypes(include=[object]).columns:
# Création d'un nouveau subplot pour chaque variable
plt.figure(figsize=(10, 4))
# Création d'un diagramme à barres pour visualiser la distribution des catégories
sns.countplot(y=column, data=df2, order = df2[column].value_counts().index)
# Ajout d'un titre
plt.title(f'Distribution de {column}')
# Affichage du graphique
plt.show()
<Figure size 1000x600 with 0 Axes>
Nous pouvons voir ainsi que la plupart des prisonniers enregistrés à Bicètre sont adressés par la préfecture de police (l'organisation administrative de Paris est assez spécifique durant la période. Toutes les fonctions de police sont réunies dans les mains du préfet de police le constat est donc peu sureprenant et que la plupart y effectuent un court séjour, de moins de deux mois.
Cela suppose de pouvoir observer leur distribution exacte, ce que permet la méthode 'value_counts()4S DE Pandas.
Là encore n'oubliez pas que la plupart des fonctions et méthodes utilisées pour analyser des données supposent que soit active une bibliothèque, donc qu'elle soit importée, et dans le cas d'un carnet jupyter que la cellule contenant les bibliothques utilisées ait été éxécutée au préalable.
Modification des paramètres d'affichage¶
help(sns.set_context)
Help on function set_context in module seaborn.rcmod:
set_context(context=None, font_scale=1, rc=None)
Set the parameters that control the scaling of plot elements.
This affects things like the size of the labels, lines, and other elements
of the plot, but not the overall style. This is accomplished using the
matplotlib rcParams system.
The base context is "notebook", and the other contexts are "paper", "talk",
and "poster", which are version of the notebook parameters scaled by different
values. Font elements can also be scaled independently of (but relative to)
the other values.
See :func:`plotting_context` to get the parameter values.
Parameters
----------
context : dict, or one of {paper, notebook, talk, poster}
A dictionary of parameters or the name of a preconfigured set.
font_scale : float, optional
Separate scaling factor to independently scale the size of the
font elements.
rc : dict, optional
Parameter mappings to override the values in the preset seaborn
context dictionaries. This only updates parameters that are
considered part of the context definition.
Examples
--------
.. include:: ../docstrings/set_context.rst
help(plt.figure)
Help on function figure in module matplotlib.pyplot:
figure(num: 'int | str | Figure | SubFigure | None' = None, figsize: 'tuple[float, float] | None' = None, dpi: 'float | None' = None, *, facecolor: 'ColorType | None' = None, edgecolor: 'ColorType | None' = None, frameon: 'bool' = True, FigureClass: 'type[Figure]' = <class 'matplotlib.figure.Figure'>, clear: 'bool' = False, **kwargs) -> 'Figure'
Create a new figure, or activate an existing figure.
Parameters
----------
num : int or str or `.Figure` or `.SubFigure`, optional
A unique identifier for the figure.
If a figure with that identifier already exists, this figure is made
active and returned. An integer refers to the ``Figure.number``
attribute, a string refers to the figure label.
If there is no figure with the identifier or *num* is not given, a new
figure is created, made active and returned. If *num* is an int, it
will be used for the ``Figure.number`` attribute, otherwise, an
auto-generated integer value is used (starting at 1 and incremented
for each new figure). If *num* is a string, the figure label and the
window title is set to this value. If num is a ``SubFigure``, its
parent ``Figure`` is activated.
figsize : (float, float), default: :rc:`figure.figsize`
Width, height in inches.
dpi : float, default: :rc:`figure.dpi`
The resolution of the figure in dots-per-inch.
facecolor : color, default: :rc:`figure.facecolor`
The background color.
edgecolor : color, default: :rc:`figure.edgecolor`
The border color.
frameon : bool, default: True
If False, suppress drawing the figure frame.
FigureClass : subclass of `~matplotlib.figure.Figure`
If set, an instance of this subclass will be created, rather than a
plain `.Figure`.
clear : bool, default: False
If True and the figure already exists, then it is cleared.
layout : {'constrained', 'compressed', 'tight', 'none', `.LayoutEngine`, None}, default: None
The layout mechanism for positioning of plot elements to avoid
overlapping Axes decorations (labels, ticks, etc). Note that layout
managers can measurably slow down figure display.
- 'constrained': The constrained layout solver adjusts axes sizes
to avoid overlapping axes decorations. Can handle complex plot
layouts and colorbars, and is thus recommended.
See :ref:`constrainedlayout_guide`
for examples.
- 'compressed': uses the same algorithm as 'constrained', but
removes extra space between fixed-aspect-ratio Axes. Best for
simple grids of axes.
- 'tight': Use the tight layout mechanism. This is a relatively
simple algorithm that adjusts the subplot parameters so that
decorations do not overlap. See `.Figure.set_tight_layout` for
further details.
- 'none': Do not use a layout engine.
- A `.LayoutEngine` instance. Builtin layout classes are
`.ConstrainedLayoutEngine` and `.TightLayoutEngine`, more easily
accessible by 'constrained' and 'tight'. Passing an instance
allows third parties to provide their own layout engine.
If not given, fall back to using the parameters *tight_layout* and
*constrained_layout*, including their config defaults
:rc:`figure.autolayout` and :rc:`figure.constrained_layout.use`.
**kwargs
Additional keyword arguments are passed to the `.Figure` constructor.
Returns
-------
`~matplotlib.figure.Figure`
Notes
-----
A newly created figure is passed to the `~.FigureCanvasBase.new_manager`
method or the `new_figure_manager` function provided by the current
backend, which install a canvas and a manager on the figure.
Once this is done, :rc:`figure.hooks` are called, one at a time, on the
figure; these hooks allow arbitrary customization of the figure (e.g.,
attaching callbacks) or of associated elements (e.g., modifying the
toolbar). See :doc:`/gallery/user_interfaces/mplcvd` for an example of
toolbar customization.
If you are creating many figures, make sure you explicitly call
`.pyplot.close` on the figures you are not using, because this will
enable pyplot to properly clean up the memory.
`~matplotlib.rcParams` defines the default values, which can be modified
in the matplotlibrc file.
# Configuration de Seaborn pour ajuster la taille de la police
sns.set_context("notebook", font_scale=0.8) # Réduit la taille de la police
# Création d'une figure plus grande. Ajustez figsize pour les dimensions souhaitées
plt.figure(figsize=(10, 10))
# Augmente la taille verticale du graphique
# Création d'un diagramme à barres pour visualiser la distribution des quartiers
sns.countplot(y="domicile_quartier_de_paris", data=df2,
order=df2["domicile_quartier_de_paris"].value_counts().index)
# Ajustement de la taille de la police directement pour les labels si nécessaire
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
# Ajout d'un titre avec une taille de police spécifique
plt.title('Distribution de domicile_quartier_de_paris', fontsize=12)
# Affichage du graphique
plt.show()
Nous pouvons cependant constater que le Paris dessinné par les premiers items ressemble au Paris grouillant pauvre et remuant, au bâti dense et ancien évoqué par Victor Hugo dans les Misérables. Le quartier des Arcis entre place du Châtelet et Hôtel de ville est l'un des plus densément peuplé, celui aussi où se trouve la place de grève ou chaque jour viennent se louer les maçons, rudes étrangers à la ville provenant souvent des montagnes du centre.
"Cette place de Grève, dernier vestige de l’ancien marché aux esclaves de l’Antiquité, était bondée d’hommes hâves et décharnés, mais s’accommodant sans trop de tristesse de leur situation de meurt-de-faim. On les voyait grelottant de froid sous de mauvaises blouses ou des vestes usées jusqu’à la couture, trépignant des pieds sur les pavés pour se réchauffer un peu ", Martin Nadaud, Léonard, maçon de la Creuse,1992 [1895].
from IPython.display import display, Image
display(Image(filename='Doc6/arcis.jpg'))